\label{sect:io}

En la presente secci'on se especifica la manera en la que deben ser ingresados 
los datos necesarios por el programa para ejecutarse. El programa recibe por 
par'ametro el nombre de archivo con la configuraci'on a ejecutar. Es decir, el
archivo con tiene los datos de entrada que determinan el caso a correr.


Cada l'inea de este archivo debe contener (6 + n) campos separados por 
espacios, donde n es la cantidad de 'angulos en la discretizaci'on,que se 
interpretan de la siguiente manera:

\begin{enumerate}
\item El primer par'ametro representa $n$, la discretizaci'on de los 'angulos.
\item El segundo par'ametro representa $m$, la discretizaci'on de los lados.
\item El tercer par'ametro representa $ti$, la temperatura interna del horno.
\item El cuarto par'ametro representa $to$, la temperatura en el exterior.
\item El quinto par'ametro representa $h$, el coeficiente de transferencia de
calor.
\item El sexto par'ametro representa $k$, la conductividad t'ermica de la pared
del horno.
\end{enumerate}

A partir de aqu'i hay n valores que representan el radio de la figura en los n
'angulos de la discretizaci'on.

Existen algunas restricciones sobre los par'ametro de entrada que se indican a
continuaci'on:

\begin{itemize}
\item La discretizaci'on de los 'angulos debe ser mayor a 1.
\item La discretizaci'on de los lados debe ser mayor a 1.
\item La temperatura externa debe ser mayor a 0 y menor o igual a la temperatura
interna.
\item El coeficiente de transferencia de calor debe ser mayor a 0.
\item La conductividad t'ermica de la pared del horno debe ser mayor a 0.
\item Cada uno de los radios debe ser mayor o igual a 0 y menor a la 
discretizaci'on de los lados.
\end{itemize}

Es importante notar que las l'ineas en blanco o que comienzan con \# son
ignoradas por el programa como comentarios.

\subsection{Scripts para la generaci\'on de casos de test}

En este apartado y el siguiente, se llamar'a a la implementaci'on de los 
algoritmos que se utilizaron \emph{la Soluci'on}. Se cuenta con scripts tanto
para generar casos de test, como para manipular la salida de la Soluci'on. 
A continuaci'on se enumeran los scripts con una explicaci'on de su 
funcionamiento.

\begin{enumerate}
\item \texttt{test\_gen.py} Genera sistem'aticamente entradas para los distintos conjuntos de casos de test con los que se probar'a la Soluci'on.
\item \texttt{gen.cpp} Construye la entrada del programa para los casos de test
generados por \texttt{test\_gen.py}.
\end{enumerate}

\texttt{text\_gen.py} no recibe entrada m'as que los archivos en donde debe 
escribir los casos de test. Este toma tres archivos distintos. El primer 
archivo es donde se almacenar'an los datos del primer grupo de casos de test, 
es decir, los que dejan fija la discretizaci'on 
(ver secci'on \ref{sect:setting}), el segundo y tercer par'ametro es donde 
se escribir'an los casos de test que corresponden a la variaci'on de 
la discretizaci'on con un pol'igono centrado y corrido respectivamente. El
formato con el que se escriben estos archivos es el formato que espera 
\texttt{gen.cpp} que se explica a continuaci'on.

La entrada para el generador de casos de test es similar a la de la Soluci'on.
El programa recibe por par'ametro el nombre de archivo con la configuraci'on a 
ejecutar. Es decir, el archivo con tiene los datos de entrada que determinan el 
caso a correr. Este programa genera pol'igonos regulares.

Cada l'inea de este archivo debe contener 11 campos separados por 
espacios, donde n es la cantidad de 'angulos en la discretizaci'on,que se 
interpretan de la siguiente manera:

\begin{enumerate}
\item El primer param'emtro $n$ representa la discretizaci'on de los 'angulos.
\item El segundo param'emtro $m$ representa la discretizaci'on de los lados. 
\item El tercer param'emtro $l$ representa la cantidad de lados del pol'igono a 
generar.
\item El cuarto param'emtro $a$ representa el radio de la circunferencia 
circunscripta al pol'igono a generar.
\item El quinto param'emtro $re$ representa el radio externo del horno.
\item El sexto param'emtro $oR$ representa el radio del offset deseado para el 
pol'igono (si es 0, est'a centrado en 0,0).
\item El s'eptimo param'emtro $oA$ representa el 'angulo del offset deseado para 
el pol'igono.
\item El octavo param'emtro $ti$ representa la temperatura interna del horno.
\item El noveno param'emtro $to$ representa la temperatura ambiente.
\item El d'ecimo param'emtro $h$ representa el coeficiente de transferencia de 
calor del borde de la pared.
\item El d'ecimo primer param'emtro $k$ representa la conductividad t'ermica de 
la pared del horno.
\end{enumerate}

Como en el input de la Soluci'on, las l'ineas en blanco o que comienzan con \# 
son ignoradas por el programa como comentarios.

\subsection{Par\'ametros de la Soluci\'on}
Los par'ametros de la Soluci'on son los siguientes:

\texttt{sol [-i $<$archivo\_entrada$>$] [-o $<$archivo\_salida$>$]}

\begin{itemize}
 \item El archivo de entrada por defecto es conf.txt.
 \item La salida por defecto es la salida est'andar.
\end{itemize}


\subsection{Nombres de los resultados}
Al ejecutar un conjunto de casos de test, la Soluci'on escribe la matriz soluci'on en un
archivo en cuyo nombre se encuentran todos los par'ametros que fueron utilizados para su
creaci'on. Como este nombre es demasiado largo para trabajar, se hizo una peque~na aplicaci'on
llamada \texttt{test\_hash.py} que dado un n'umero y una lista de archivos, genera un archivo
\texttt{hash.sh} que renombra cada archivo a un archivo cuyo nombre es \texttt{sol$nnn$.pm},
donde $nnn$ es un n'umero mayor o igual al n'umero pasado por par'ametro.

\subsection{Visualizaci'on de la infornaci'on}
Considerando que la matriz souci'on se encuentra en coordenadas polares, lo primero que se
hizo fue escribir un programa que la traduzca a coordenadas cartesianas para facilitar
la generaci'on de gr'aficos. Luego, teniendo esta matriz se consideraron dos opciones para
generar los gr'aficos: usar un programa externo, y escribir un programa que los genere.

La primera opci'on enumerada, fue la primera en ser encarada, puesto que es mucho mas sencillo
utilizar un programa que codificar uno. 

Como resultado de la b'usqueda de un programa que se encargara de la tarea de visualizar 
este tipo de informaci'on, y que adem'as fuera libre se lleg'o a \emph{OpenDx}(ver ~\cite{OpenDx}). 
Se consider'o tambien trabajar con \emph{GNUPlot}, pero el resultado obtenido para el 
trabajo anterior no fue el esperado y se abandono la idea.

Luego de trabajar aproximadamente una semana con \emph{OpenDx},
se decidi'o dejar de usarlo, porque no era posible automatizar la generaci'on de gr'aficos, 
y como consecuencia se tardaba demasiado para analizar errores y comportamientos no 
esperados.

Por 'ultimo se encar'o la tarea de codificar un programa que se encargue de generar los 
gr'aficos. Este programa utiliza la API para \texttt{C++} de  \emph{imagemagick}, 
\texttt{Magick++} (ver ~\cite{ImageMagick}) para escribir 
archivos en formato \texttt{PNG}. Se decidi'o esto 'ultimo, puesto que es equivalente a que
se hubiera utilizado un programa externo, como \emph{OpenDx} que sea necesario
instalar para visualizar la informaci'on. En este caso, en las distribuciones de \emph{Linux}
basadas en \emph{Debian}, s'olo es necesario instalar el paquete \emph{imagemagick-dev}.


\subsection{Generaci'on de gr'aficos}
Para generar los gr'aficos se cuenta con las siguientes aplicaciones:

\begin{itemize}
	\item \texttt{min\_max.py}: Dada una lista de matrices, calcula el m'aximo y el m'inimo
valor y los escribe en \texttt{conf.txt}. Es necesario tener estos valores para que los 
gr'aficos tengan contraste, dado que si el color azul lo tuviera un valor muy bajo, se ver'ia
todo rojo, y si el color rojo lo tuviera un valor muy alto, se veria todo azul.

	\item \texttt{translate\_matrix}: Este programa se encarga de traducir las matrices 
de coordenadas polares a coordenadas cartesianas, y adem'as escribe un archivo con la matriz
cartesiana o con el archivo \texttt{PNG} seg'un lo que se le indique. El modo de uso es

\texttt{translate\_matrix} [-i $<$input\_file$>$=sol1.pm] -o $<$output\_file$>$ [-v] [-t]

el parametro -v imprime informaci'on de depuraci'on, y el par'ametro -t indica que solo
se desea traducir la matriz, pero no escribir un archivo \texttt{PNG}

	\item \texttt{do.sh}: Dada un directorio con archivos de prueba, calcula el valor m'inimo
y m'aximo de cada una de las matrices, y las grafica en un archivo \texttt{PNG}.

\end{itemize}



